﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MergulhoGrafo
{
    public class Retangulo
    {
        #region Atributos
        
        public int numeroRef;
        public int Vert1, Vert2;
        public int Face1, Face2;
        public bool EhTorcida = false;
        public bool EhContraida = false;

        public Pair ParCurto1;
        public Pair ParCurto2;
        public Pair ParLongo1;
        public Pair ParLongo2;
        private Nodo Nodo1, Nodo2, Nodo3, Nodo4;

        #endregion

        #region Contrutor

        public Retangulo(int numeroRef)
        {
            this.numeroRef = numeroRef;
            Nodo nodo1 = new Nodo(4 * (numeroRef - 1) + 1, this);
            Nodo nodo2 = new Nodo(4 * (numeroRef - 1) + 2, this);
            Nodo nodo3 = new Nodo(4 * (numeroRef - 1) + 3, this);
            Nodo nodo4 = new Nodo(4 * (numeroRef), this);

            this.Nodo1 = nodo1;
            this.Nodo2 = nodo2;
            this.Nodo3 = nodo3;
            this.Nodo4 = nodo4;

            ParCurto1 = new Pair(nodo1, nodo2);
            nodo1.Curto = nodo2;
            ParCurto2 = new Pair(nodo3, nodo4);
            nodo3.Curto = nodo4;
            ParLongo1 = new Pair(nodo1, nodo4);
            nodo1.Longo = nodo4;
            ParLongo2 = new Pair(nodo2, nodo3);
            nodo2.Longo = nodo3;
        }

        #endregion

        #region Métodos
        public Pair GetParCurto1()
        { 
            return ParCurto1;
        }

        public Pair GetParCurto2()
        {
            return ParCurto2; 
        }

        public void TocerAresta()
        {
            this.EhTorcida = true;
            this.ParLongo1.Nodo2 = this.Nodo3;
            this.ParLongo2.Nodo2 = this.Nodo4;

            this.Nodo1.Longo = this.Nodo3;
            this.Nodo2.Longo = this.Nodo4;
        }

        public Retangulo Dual()
        {
            Retangulo newRetangulo = this; 
            
            Pair temp = null;
            
            temp = newRetangulo.ParCurto1;
            newRetangulo.ParCurto1 = newRetangulo.ParLongo1;
            newRetangulo.ParLongo1 = temp;

            temp = newRetangulo.ParCurto2;
            newRetangulo.ParCurto2 = newRetangulo.ParLongo2;
            newRetangulo.ParLongo2 = temp;
            return newRetangulo;
        }
        
        public Nodo NodoEsqIni()
        {
            return this.Nodo2;
        }

        public Nodo NodoDirIni()
        {
            return this.Nodo1;
        }

        public Nodo NodoEsqSup()
        {
            return this.Nodo4;
        }

        public Nodo NodoDirSup()
        {
            return this.Nodo3;
        }

        public void Contrair()
        {
            Nodo nodo_link_inf_d = this.Nodo1.Link;
            Nodo nodo_link_sup_d = this.Nodo1.Longo.Link;

            Nodo nodo_link_inf_e = this.Nodo2.Link;
            Nodo nodo_link_sup_e = this.Nodo2.Longo.Link;

            nodo_link_inf_d.Link = nodo_link_sup_d;
            nodo_link_inf_e.Link = nodo_link_sup_e;

            this.EhContraida = true;
        }
        #endregion
    }
}
